#pragma once
#include <stdint.h>

// 一路ssrc 对应的信息
typedef struct RtpState_
{
	int32_t   iPayLoadType = 0;
	uint32_t  uPeerSsrc = 0;             // SSRC
	uint32_t  uPeerCsrc = 0;             // CSRC 
	uint64_t  uPacketCount = 0;         // 总包数
	uint64_t  uCumulativeLost = 0;       // 累计丢包数

	uint64_t uOutOfOrderCount = 0;      // 乱序包数
	uint64_t uOutOfOrderDiffMax = 0;    // 最大乱序差

	float     fFractionLostAll = 0;     // 总丢包率
	float     fFractionLost = 0;         // 实时丢包率, 百分比
	float     fFractionLostMax = 0;		// 实时丢包率最大值
	
	int32_t  ibps = 0;                  // 实时码率单位是bps
	int32_t  iPacketFrequency = 0;      // 包频率

	uint64_t uExtValueTrackId = 0;     // rtp 扩展中trackId RtpStateParameter 参数中 iTrackExtensionIndex如果指定则解析，不指定不解析

}RtpState;


struct RtpStateParameter
{
	int32_t iTrackExtensionIndex = 0; // 默认参数不解析扩展，如果要解析trackId 请指定正确的id
	int32_t iCacheDuration = 2000; //ms 每次ssrc 缓存链表长度

	// 主子码流切换时候，再切换回来时候seq 跳转，正常计算会有很大丢包，这里发现输入包时间超过一定时间则重置历史状态
	int32_t iTimeOutResetThreshold = 3000;  // 超过设定时间 没有收到流，重置状态视频流重置会附带重置冗余和重传流,如果设置为 0， 不做重置设置
};

//创建RtpState 句柄
// eRtpStreamType 
// iTrackExtensionIndex -1, 不解析扩展，如果要解析扩展 支持 one-byte 扩展解析，会议时候，如果要解析TrackId，请正确填写iTrackExtensionIndex
//return 返回句柄 > 0 成功， <= 0 失败


int32_t CreateRtpState(const RtpStateParameter &oRtpStateParameter);

//oHandle input 输入句柄
//return 0 成功

int32_t DestoryRtpState(int32_t oHandle);

//oHandle input 输入句柄
// pData rtp 数据 ，兼容带relayId，内部会自动识别
// iLen  rtp 数据长度
//return 0 成功

int32_t IncomingRtpState(int32_t oHandle, const int8_t* pData, int32_t iLen);

//oHandle input 输入句柄
//return 返回ssrc 的个数，这个大小用来申请空间，在GetRtpStateInfo 时候，oRtpStateArray 数组的大小

int32_t GetRtpStateNumOfSsrc(int32_t oHandle);

//oHandle input 输入句柄
// RtpStateArray 返回相关状态信息
// iMaxRtpStateNum oRtpStateArray 的数组大小
// return oRtpStateArray的数量 
int32_t GetRtpStateInfo(int32_t oHandle, RtpState* oRtpStateArray, int32_t iMaxRtpStateNum);


//oHandle input 输入句柄 不会触发内部重置状态
// 暂停期间，实时丢包率为0 ,码率 0, 
// return 0 成功
int32_t RtpStatePause(int32_t oHandle);

//oHandle input 输入句柄 
// return 0 成功
int32_t RtpStateResume(int32_t oHandle);
